#include <unordered_set>
#include <iostream>
using namespace std;

class Solution
{
public:
    bool isHappy(int n)
    {
        unordered_set<int> seen; // 用于存储已经出现过的数字
        while (n != 1)
        {
            if (seen.count(n)) // 如果 n 已经出现过，说明进入了循环
            {
                return false;
            }
            seen.insert(n); // 将当前数字加入集合

            int next_n = 0;
            while (n > 0)
            {
                int digit = n % 10;      // 获取最后一位数字
                next_n += digit * digit; // 计算平方并累加
                n /= 10;                 // 去掉最后一位数字
            }
            n = next_n; // 更新 n 为下一个数字
        }
        return true; // 如果 n 变为 1，返回 true
    }
};

#include <iostream>
#include <list>
using namespace std;
class Solution
{
public:
    bool isHappy(int n)
    {
        int slow = n, fast = n;
        for (;;)
        {
            slow = getDigitSqrSigma(slow);
            fast = getDigitSqrSigma(getDigitSqrSigma(fast));
            if (fast == 1)
                break;
            if (fast == slow)
                return false;
        }
        return true;
    }
    int getDigitSqrSigma(int n)
    {
        int sum = 0;
        while (n)
        {
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }
};